Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


sbapp/mapview/source.py HEAD (8b8a5035) Text, 6.54 KB

Te6edf3__all__ Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffMapSourceTa5d6ff"Tb4b4b4]

Tff7b72import T7ee787RNS
Tff7b72import T7ee787hashlib
Tff7b72from T7ee787math Tff7b72import Te6edf3atanTb4b4b4, Te6edf3ceilTb4b4b4, Te6edf3cosTb4b4b4, Te6edf3expTb4b4b4, Te6edf3logTb4b4b4, Te6edf3piTb4b4b4, Te6edf3tan

Tff7b72from T7ee787kivyT7ee787.T7ee787metrics Tff7b72import Te6edf3dp

Tff7b72from T7ee787mapviewT7ee787.T7ee787constants Tff7b72import Te6edf3CACHE_DIRTb4b4b4, Te6edf3MAX_LATITUDETb4b4b4, Te6edf3MAX_LONGITUDETb4b4b4, Te6edf3MIN_LATITUDETb4b4b4, Te6edf3MIN_LONGITUDE
Tff7b72from T7ee787mapviewT7ee787.T7ee787downloader Tff7b72import Te6edf3Downloader
Tff7b72from T7ee787mapviewT7ee787.T7ee787utils Tff7b72import Te6edf3clamp


Tff7b72class T56d364MapSourceTb4b4b4:
Te6edf3mt_key Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3st_key Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3attribution_osm Tff7b72= Ta5d6ff"Ta5d6ff© OpenStreetMap contributorsTa5d6ff"
Te6edf3attribution_ve Tff7b72= Ta5d6ff"Ta5d6ff© VirtualEarthTa5d6ff"
Te6edf3attribution_mt Tff7b72= Ta5d6ff"Ta5d6ff© MapTiler © OpenStreetMap contributorsTa5d6ff"
Te6edf3attribution_st Tff7b72= Ta5d6ff"Ta5d6ff© Stadia © OpenMapTiles © OpenStreetMap contributorsTa5d6ff"
Te6edf3custom_1_url Tff7b72= Ta5d6ff"Ta5d6ffhttp://Tffd700{s}Ta5d6ff.tile.openstreetmap.org/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.pngTa5d6ff"
Te6edf3providers Tff7b72= Tb4b4b4{Tb4b4b4}

Tf0883e@staticmethod
Tff7b72def Td2a8ffupdate_providersTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3MapSourceTff7b72.Td2a8ffproviders Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffosmTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffOpenStreetMapTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttp://Tffd700{s}Ta5d6ff.tile.openstreetmap.org/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.pngTa5d6ff"Tb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_osmTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmt_topoTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffTopographicTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://api.maptiler.com/maps/topo-v4/256/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.png?key=Ta5d6ff"Tff7b72+Te6edf3MapSourceTff7b72.Td2a8ffmt_keyTb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_mtTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmt_outdoorTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffOutdoorTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://api.maptiler.com/maps/outdoor-v4/256/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.png?key=Ta5d6ff"Tff7b72+Te6edf3MapSourceTff7b72.Td2a8ffmt_keyTb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_mtTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmt_hybridTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffHybridTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://api.maptiler.com/maps/hybrid-v4/256/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.jpg?key=Ta5d6ff"Tff7b72+Te6edf3MapSourceTff7b72.Td2a8ffmt_keyTb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_mtTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffvirtualearthTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffVirtualEarthTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttp://ecn.t3.tiles.virtualearth.net/tiles/aTffd700{q}Ta5d6ff.jpeg?g=1Ta5d6ff"Tb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_veTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffopentopoTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffOpenTopoTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://Tffd700{s}Ta5d6ff.tile.opentopomap.org/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.pngTa5d6ff"Tb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_osmTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffatlasTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffAtlasTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/Tffd700{z}Ta5d6ff/Tffd700{y}Ta5d6ff/Tffd700{x}Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff© EsriTa5d6ff"Tb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffgooglemapsTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffGoogle MapsTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://mt1.google.com/vt/lyrs=m&x=Tffd700{x}Ta5d6ff&y=Tffd700{y}Ta5d6ff&z=Tffd700{z}Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff© GoogleTa5d6ff"Tb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffst_terrainTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffStadia TerrainTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://tiles.stadiamaps.com/tiles/stamen_terrain/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.png?api_key=Ta5d6ff"Tff7b72+Te6edf3MapSourceTff7b72.Td2a8ffst_keyTb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_stTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffst_darkTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffStadia DarkTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://tiles.stadiamaps.com/tiles/alidade_smooth_dark/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.png?api_key=Ta5d6ff"Tff7b72+Te6edf3MapSourceTff7b72.Td2a8ffst_keyTb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_stTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffst_brightTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffStadia BrightTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://tiles.stadiamaps.com/tiles/alidade_smooth/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.png?api_key=Ta5d6ff"Tff7b72+Te6edf3MapSourceTff7b72.Td2a8ffst_keyTb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_stTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffst_satTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffStadia SatelliteTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Ta5d6ff"Ta5d6ffhttps://tiles.stadiamaps.com/tiles/alidade_satellite/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.jpg?api_key=Ta5d6ff"Tff7b72+Te6edf3MapSourceTff7b72.Td2a8ffst_keyTb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffattribution_stTb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffcustom_1Ta5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffCustom 1Ta5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff19Tb4b4b4, Te6edf3MapSourceTff7b72.Td2a8ffcustom_1_urlTb4b4b4, Ta5d6ff"Ta5d6ffCustom MapTa5d6ff"Tb4b4b4, T79c0ff256Tb4b4b4)Tb4b4b4,
Tb4b4b4}

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffMapTa5d6ff"Tb4b4b4, Te6edf3urlTff7b72=Ta5d6ff"Ta5d6ffhttp://Tffd700{s}Ta5d6ff.tile.openstreetmap.org/Tffd700{z}Ta5d6ff/Tffd700{x}Ta5d6ff/Tffd700{y}Ta5d6ff.pngTa5d6ff"Tb4b4b4, Te6edf3cache_keyTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3min_zoomTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_zoomTff7b72=T79c0ff19Tb4b4b4, Te6edf3tile_sizeTff7b72=T79c0ff256Tb4b4b4, Te6edf3image_extTff7b72=Ta5d6ff"Ta5d6ffpngTa5d6ff"Tb4b4b4, Te6edf3attributionTff7b72=Ta5d6ff"Ta5d6ff© OpenStreetMap contributorsTa5d6ff"Tb4b4b4,
Te6edf3subdomainsTff7b72=Ta5d6ff"Ta5d6ffabcTa5d6ff"Tb4b4b4, Te6edf3quad_key Tff7b72= Tff7b72FalseTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:

T8b949e# Possible cache hit, but very unlikely
Tff7b72if Te6edf3cache_key Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3cache_key Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffsha224Tb4b4b4(Te6edf3urlTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff10Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffurl Tff7b72= Te6edf3url
Tff7b72selfTff7b72.Td2a8ffcache_key Tff7b72= Te6edf3cache_key
Tff7b72selfTff7b72.Td2a8ffmin_zoom Tff7b72= Te6edf3min_zoom
Tff7b72selfTff7b72.Td2a8ffmax_zoom Tff7b72= Te6edf3max_zoom
Tff7b72selfTff7b72.Td2a8fftile_size Tff7b72= Te6edf3tile_size
Tff7b72selfTff7b72.Td2a8ffimage_ext Tff7b72= Te6edf3image_ext
Tff7b72selfTff7b72.Td2a8ffattribution Tff7b72= Te6edf3attribution
Tff7b72selfTff7b72.Td2a8ffsubdomains Tff7b72= Te6edf3subdomains
Tff7b72selfTff7b72.Td2a8ffquad_key Tff7b72= Te6edf3quad_key
Tff7b72selfTff7b72.Td2a8ffcache_fmt Tff7b72= Ta5d6ff"Tffd700{zoom}Ta5d6ff/Tffd700{tile_x}Ta5d6ff/Tffd700{tile_y}Ta5d6ff.Tffd700{image_ext}Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdp_tile_size Tff7b72= Tffa657minTb4b4b4(Te6edf3dpTb4b4b4(Tff7b72selfTff7b72.Td2a8fftile_sizeTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8fftile_size Tff7b72* T79c0ff2Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdefault_lat Tff7b72= Tff7b72selfTff7b72.Td2a8ffdefault_lon Tff7b72= Tff7b72selfTff7b72.Td2a8ffdefault_zoom Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffbounds Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcache_dir Tff7b72= Te6edf3kwargsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffcache_dirTa5d6ff'Tb4b4b4, Te6edf3CACHE_DIRTb4b4b4)Tff7b72+Tffa657strTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff/Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff"Tb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8fffrom_providerTb4b4b4(Te6edf3keyTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Te6edf3quad_key Tff7b72= Te6edf3kwargsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffquad_keyTa5d6ff'Tb4b4b4, Tff7b72FalseTb4b4b4)
Te6edf3provider Tff7b72= Te6edf3MapSourceTff7b72.Td2a8ffprovidersTb4b4b4[Te6edf3keyTb4b4b4]
Te6edf3cache_dir Tff7b72= Te6edf3kwargsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffcache_dirTa5d6ff'Tb4b4b4, Te6edf3CACHE_DIRTb4b4b4)
Te6edf3options Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3nameTb4b4b4, Te6edf3is_overlayTb4b4b4, Te6edf3min_zoomTb4b4b4, Te6edf3max_zoomTb4b4b4, Te6edf3urlTb4b4b4, Te6edf3attributionTb4b4b4, Te6edf3tile_size Tff7b72= Te6edf3providerTb4b4b4[Tb4b4b4:T79c0ff7Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3providerTb4b4b4) Tff7b72> T79c0ff7Tb4b4b4: Te6edf3options Tff7b72= Te6edf3providerTb4b4b4[T79c0ff7Tb4b4b4:Tb4b4b4]
Tff7b72return Te6edf3MapSourceTb4b4b4(Te6edf3nameTff7b72=Te6edf3nameTb4b4b4, Te6edf3cache_keyTff7b72=Te6edf3keyTb4b4b4, Te6edf3min_zoomTff7b72=Te6edf3min_zoomTb4b4b4, Te6edf3max_zoomTff7b72=Te6edf3max_zoomTb4b4b4,
Te6edf3urlTff7b72=Te6edf3urlTb4b4b4, Te6edf3cache_dirTff7b72=Te6edf3cache_dirTb4b4b4, Te6edf3attributionTff7b72=Te6edf3attributionTb4b4b4,
Te6edf3quad_keyTff7b72=Te6edf3quad_keyTb4b4b4, Te6edf3tile_sizeTff7b72=Te6edf3tile_sizeTb4b4b4, Tff7b72*Tff7b72*Te6edf3optionsTb4b4b4)

T8b949e# Get the x position on the map using this map source's projection
T8b949e# (0, 0) is located at the top left.
Tff7b72def Td2a8ffget_xTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3lonTb4b4b4)Tb4b4b4:
Te6edf3lon Tff7b72= Te6edf3clampTb4b4b4(Te6edf3lonTb4b4b4, Te6edf3MIN_LONGITUDETb4b4b4, Te6edf3MAX_LONGITUDETb4b4b4)
Tff7b72return Tb4b4b4(Tb4b4b4(Te6edf3lon Tff7b72+ T79c0ff180.0Tb4b4b4) Tff7b72/ T79c0ff360.0 Tff7b72* Tffa657powTb4b4b4(T79c0ff2.0Tb4b4b4, Te6edf3zoomTb4b4b4)Tb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffdp_tile_size

T8b949e# Get the y position on the map using this map source's projection,
T8b949e# (0, 0) is located at the top left.
Tff7b72def Td2a8ffget_yTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3latTb4b4b4)Tb4b4b4:
Te6edf3lat Tff7b72= Te6edf3clampTb4b4b4(Tff7b72-Te6edf3latTb4b4b4, Te6edf3MIN_LATITUDETb4b4b4, Te6edf3MAX_LATITUDETb4b4b4)
Te6edf3lat Tff7b72= Te6edf3lat Tff7b72* Te6edf3pi Tff7b72/ T79c0ff180.0
Tff7b72return Tb4b4b4( Tb4b4b4(T79c0ff1.0 Tff7b72- Te6edf3logTb4b4b4(Te6edf3tanTb4b4b4(Te6edf3latTb4b4b4) Tff7b72+ T79c0ff1.0 Tff7b72/ Te6edf3cosTb4b4b4(Te6edf3latTb4b4b4)Tb4b4b4) Tff7b72/ Te6edf3piTb4b4b4) Tff7b72/ T79c0ff2.0 Tff7b72* Tffa657powTb4b4b4(T79c0ff2.0Tb4b4b4, Te6edf3zoomTb4b4b4) Tb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffdp_tile_size

T8b949e# Get the longitude to the x position in the map source's projection
Tff7b72def Td2a8ffget_lonTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3xTb4b4b4)Tb4b4b4:
Te6edf3dx Tff7b72= Te6edf3x Tff7b72/ Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdp_tile_sizeTb4b4b4)
Te6edf3lon Tff7b72= Te6edf3dx Tff7b72/ Tffa657powTb4b4b4(T79c0ff2.0Tb4b4b4, Te6edf3zoomTb4b4b4) Tff7b72* T79c0ff360.0 Tff7b72- T79c0ff180.0
Tff7b72return Te6edf3clampTb4b4b4(Te6edf3lonTb4b4b4, Te6edf3MIN_LONGITUDETb4b4b4, Te6edf3MAX_LONGITUDETb4b4b4)

T8b949e# Get the latitude to the y position in the map source's projection
Tff7b72def Td2a8ffget_latTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3yTb4b4b4)Tb4b4b4:
Te6edf3dy Tff7b72= Te6edf3y Tff7b72/ Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdp_tile_sizeTb4b4b4)
Te6edf3n Tff7b72= Te6edf3pi Tff7b72- T79c0ff2 Tff7b72* Te6edf3pi Tff7b72* Te6edf3dy Tff7b72/ Tffa657powTb4b4b4(T79c0ff2.0Tb4b4b4, Te6edf3zoomTb4b4b4)
Te6edf3lat Tff7b72= Tff7b72-T79c0ff180.0 Tff7b72/ Te6edf3pi Tff7b72* Te6edf3atanTb4b4b4(T79c0ff0.5 Tff7b72* Tb4b4b4(Te6edf3expTb4b4b4(Te6edf3nTb4b4b4) Tff7b72- Te6edf3expTb4b4b4(Tff7b72-Te6edf3nTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3clampTb4b4b4(Te6edf3latTb4b4b4, Te6edf3MIN_LATITUDETb4b4b4, Te6edf3MAX_LATITUDETb4b4b4)

Tff7b72def Td2a8ffget_row_countTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3zoom Tff7b72== T79c0ff0Tb4b4b4: Tff7b72return T79c0ff1
Tff7b72return T79c0ff2 Tff7b72<< Tb4b4b4(Te6edf3zoom Tff7b72- T79c0ff1Tb4b4b4)

Tff7b72def Td2a8ffget_col_countTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3zoom Tff7b72== T79c0ff0Tb4b4b4: Tff7b72return T79c0ff1
Tff7b72return T79c0ff2 Tff7b72<< Tb4b4b4(Te6edf3zoom Tff7b72- T79c0ff1Tb4b4b4)

Tff7b72def Td2a8ffget_min_zoomTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffmin_zoom
Tff7b72def Td2a8ffget_max_zoomTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffmax_zoom

T8b949e# Add this tile to load within the downloader
Tff7b72def Td2a8fffill_tileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tileTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3tileTff7b72.Td2a8ffstate Tff7b72== Ta5d6ff"Ta5d6ffdoneTa5d6ff"Tb4b4b4: Tff7b72return
Te6edf3DownloaderTff7b72.Td2a8ffinstanceTb4b4b4(Te6edf3cache_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffcache_dirTb4b4b4)Tff7b72.Td2a8ffdownload_tileTb4b4b4(Te6edf3tileTb4b4b4)

Tff7b72def Td2a8ffclear_prefetchesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3DownloaderTff7b72.Td2a8ffinstanceTb4b4b4(Te6edf3cache_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffcache_dirTb4b4b4)Tff7b72.Td2a8ffclear_prefetchesTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffprefetch_tileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3tile_xTb4b4b4, Te6edf3tile_yTb4b4b4)Tb4b4b4:
Te6edf3DownloaderTff7b72.Td2a8ffinstanceTb4b4b4(Te6edf3cache_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffcache_dirTb4b4b4)Tff7b72.Td2a8ffprefetch_tileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3tile_xTb4b4b4, Te6edf3tile_yTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────